package cn.yinzhiping.rabbbitmqlearn.config;


import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.concurrent.*;

/***
 * 功能描述: 基于LinkedBlockingQueue  实现的内存队列
 * 〈〉
 * @Param:
 * @Return:
 * @Author: by mocar
 * @Date: 2020/10/10 16:50
 */
@Component
@Slf4j
public class JvmCacheLinkedBlockingQueue {
    //队列大小
    private final int QUEUE_LENGTH = 1000 *1;
    //基于内存的阻塞队列
    private BlockingQueue<String> queue = new LinkedBlockingQueue<String>(QUEUE_LENGTH);
    //创建计划任务执行器
    private ScheduledExecutorService es = Executors.newScheduledThreadPool(1);

    /**
     * 构造函数，执行execute方法
     */
    public JvmCacheLinkedBlockingQueue() {
        execute();
    }

    /**
     * 添加信息至队列中
     * @param content
     */
    public void putQueue(String content) {
        try {
            //添加，队列满了则一直等待
            queue.put(content);
            log.warn("queue.put:  {}" , content);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void offerQueue(String content) {
        //添加，队列满了返回false
        queue.offer(content);
    }

    public String takeQueue() {
        String takeStr = null ;
        try {
            //取出，队列空的则一直等待
            takeStr = queue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return takeStr;
    }

    public String pollQueue() {
        //取出，队列空则返回 null
        String pollStr = queue.poll();
        return pollStr;
    }

    /**
     * 初始化执行
     */
    public void execute() {
        //10ms执行一次
        es.scheduleWithFixedDelay(new Runnable(){
            @Override
            public void run() {
                String content = takeQueue();
                //模拟程序运行时间
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //处理队列中的信息。。。。。
                log.warn("正在处理队列中的消息: {}",content );
            }
        }, 0, 100, TimeUnit.MILLISECONDS);
    }
}
